<?php
namespace Swiftx\Interfaces\DataBase;

/**
 * 数据库方言接口
 * @author      胡永强 <odaytudio@gmail.com>
 * @since       2015-12-09
 * @copyright   Copyright (c) 2014-2015 Swiftx Inc.
 * @property string $Query
 * @property string $Row
 * @property string $Rows
 * @property string $Count
 * @property string $Delete
 * @property $this $Distinct
 */
interface Select{

    /**
     * 数据表全名
     * @param string $table
     * @param string|null $name
     * @return Select
     */
    public function table(string $table, string $name=null):Select;

    /**
     * 消除重复项
     * @param bool $status
     * @return Select
     */
    public function distinct(bool $status = true):Select;

    /**
     * 选择列（在原有基础上新增）
     * @param string $field
     * @param string $name
     * @return Select
     */
	public function select($field, $name=null):Select;

    /**
     * 选定列
     * @param string[] 列名
     * @return Select
     */
	public function fields(string ...$args):Select;

    /**
     * 增加查询条件
     * @param array ...$args
     * @return Select
     */
    public function where(... $args):Select;

    /**
     * 新增且条件
     * @param array ...$args
     * @return Select
     */
    public function and(... $args):Select;

    /**
     * 新增或条件
     * @param array ...$args
     * @return Select
     */
    public function or(... $args):Select;

    /**
     * 新增内连接
     * @param string $table
     * @param null $name
     * @return Select
     */
    public function join(string $table, $name=null):Select;

    /**
     * 新增左连接
     * @param string $table
     * @param null $name
     * @return Select
     */
    public function leftJoin(string $table, $name=null):Select;

    /**
     * 新增左连接
     * @param string $table
     * @param null $name
     * @return Select
     */
    public function rightJoin(string $table, $name=null):Select;

    /**
     * 新增左连接
     * @param string $table
     * @param null $name
     * @return Select
     */
    public function fullJoin(string $table, $name=null):Select;

    /**
     * 增加Order排序条件
     * @param string $field
     * @param bool $asc
     * @return Select
     */
	public function orderBy(string $field, bool $asc=true):Select;

    /**
     * 增加Limit查找条件
     * @param int $number
     * @param int $start
     * @return $this
     */
	public function limit(int $number, int $start=1);

    /**
     * 获取SQL语句
     * @return string
     */
    public function getSql():string;

    /**
     * 获取SQL语句
     * @return string
     */
    public function __toString();

}